﻿using Microsoft.IdentityModel.Tokens;
using System;
using System.Collections.Generic;
using System.IdentityModel.Tokens.Jwt;
using System.IO;
using System.Security.Claims;
using System.Text;

namespace Mall.Common
{
    /// <summary>
    ///  iss(Issuser)：JWT的签发主体；
    ///  sub(Subject)：JWT的主体，即它的所有人
    ///  aud(Audience)：JWT的接收对象
    ///  exp(Expiration time)：时间戳，JWT的过期时间
    ///  nbf(Not Before)：时间戳，JWT生效的开始时间
    ///  iat(Issued at)：时间戳，JWT的签发时间
    ///  jti(JWT ID)：JWT的唯一标识
    ///   </summary>
    public class JwtHelper
    {
        /// <summary>
        /// 创建token
        /// </summary>
        /// <param name="claims"></param>
        /// <returns></returns>
        public static string CreateToken()
        {
            //DateTime,表示时间上的一刻，通常以日期和当天时间来表示。
            //DateTimeOffset,表示一个时间点，通常以相对于协调世界时（UTC）的日期和时间来表示
            var second = 300;//秒
            var claims = new Claim[]
            {
                new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()),//唯一标识
                new Claim(JwtRegisteredClaimNames.Iss,"Issuser-zlf"),//颁发者
                new Claim(JwtRegisteredClaimNames.Aud,"Audience-zlf"),//接收者
                new Claim(JwtRegisteredClaimNames.Iat,$"{ DateTimeOffset.Now.ToUnixTimeSeconds()}") ,//签发时间
                new Claim(JwtRegisteredClaimNames.Nbf,$"{DateTimeOffset.Now.ToUnixTimeSeconds()}") ,//生效开始时间
                new Claim(JwtRegisteredClaimNames.Exp,$"{ DateTimeOffset.Now.AddSeconds(second).ToUnixTimeSeconds()}")//过期时间
            };

            //取出秘钥
            var securityKey = JwtSecret.GetAccountKey();
            var key = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(securityKey));//取出秘钥，对称安全键
            var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);//签名凭据，安全算法
            var token = new JwtSecurityToken(
              signingCredentials: creds,//签名凭据
              claims: claims
            );
            string jwtToken = new JwtSecurityTokenHandler().WriteToken(token);
            return jwtToken;
        }
    }

    public class JwtSecret
    {
        /// <summary>
        /// 读取txt文件，token私钥(随机字符串)
        /// </summary>
        /// <param name="path"></param>
        /// <returns></returns>
        public static string GetAccountKey()
        {
            //设置[公钥私钥]文件路径
            string privateKeyPath = @"privateKey.txt";
            var privateKey = GetSecurityKey(privateKeyPath);
            return privateKey;
        }

        private static string GetSecurityKey(string tmpPath)
        {
            //设置[公钥私钥]文件路径
            string fullName = Environment.CurrentDirectory;
            var fullPath = fullName.Substring(0, fullName.LastIndexOf("\\")) + "\\Logistics.Web\\wwwroot\\jwtkey\\" + tmpPath;
            var refreshKey = File.ReadAllText(fullPath);
            return refreshKey;
        }
    }
}
